# -*- coding:utf-8 -*-
from node import Node
import uuid
from graphviz import Digraph
from random import sample
class Tree:
    def __init__(self,root=None):
        self.root = root
        self.dot = Digraph(comment='Binary Tree')
    '''
    创建树
    '''
    def createTree(self, item):
        if item == None or len(item)==0:
            return
        else:
            node_list=[]
            for i in item:
                node=Node(i['id'], i['name'],i['parent'] , i['hitcon'], i['text'], i['answer'])
                node_list.append(node)
            for i in range(len(node_list)):
                if node_list[i].parent!=None:
                    for j in range(i):
                        if node_list[j].id==node_list[i].parent:
                            parent_node=node_list[j]
                            break
                    self.add(parent_node,node_list[i])
                else:
                    self.root=node_list[i]
    '''添加节点'''
    def add(self, parent_node, node):
        if parent_node == None:
            if node is not None:
                self.root = node
            else:
                return
        else:
            node.parent = parent_node.id
            parent_node.child.append(node)

    # 利用Graphviz实现多叉树的可视化
    def print_tree(self, save_path='./Binary_Tree.gv', label=False):

        # colors for labels of nodes
        colors = ['skyblue', 'tomato', 'orange', 'purple', 'green', 'yellow', 'pink', 'red']

        # 绘制以某个节点为根节点的二叉树
        def print_node(node, node_tag):
            # 节点颜色
            color = sample(colors, 1)[0]
            if len(node.child) ==0:
                return
            for node_child in node.child:
                tag = str(node_child.name)
                lable = str(node_child.id)
                self.dot.node(lable,label=tag, style='filled', color=color, fontname='Microsoft Yahei')
                label_string = str(node_child.hitcon)
                print_node(node_child, lable)
                self.dot.edge(node_tag, lable, label=label_string, fontname='Microsoft Yahei')  # 左节点与其父节点的连线


        # 如果树非空
        if self.root is not None:
            root_tag = str(self.root.name)  # 根节点标签
            self.dot.node(root_tag, str(self.root.name), style='filled', color=sample(colors, 1)[0],
                          fontname='SimSun')  # 创建根节点
            print_node(self.root, root_tag)
        self.dot.view()
        self.dot.render(save_path)  # 保存文件为指定文件
    def DFS(self,node):
        if node is None:  # 首先判断根节点是否为空，为空则返回
            return
        print(node.name,end=' ')
        if len(node.child)==0:
            return
        else:
            for i in node.child:
                self.DFS(i)
    def chat(self):
        return '闲聊'
    def tendency(self):
        return '是否倾向'
    def query(self):
        return '检索'
    '''确定下一步走向 ， 返回回话'''
    def findHidCon(self,node,text):
        hitcat=self.strategyMake(text)
        for child_node in node.child:
            if child_node.hitcon == hitcat:
                next_node = child_node
                return next_node
        return
    '''策略判定
        返回策略号'''
    def strategyMake(self,text):
        return '策略'
    '''整个会话流程'''
    def wholeConverflow(self):
        start_node = self.root
        while start_node !=None or start_node.name is not'结束':
            text = '患者回话'
            next_node =self.findHidCon(start_node,text)
            start_node = next_node
        return '回话完成'


if __name__ == '__main__':
    tree = Tree()
    '''
        self.id = id
        self.name = name
        self.parent = parent
        self.child = []                                                                        
        self.text = text
        self.hitcon = hitcon
        self.answer = answer
        '''
    list = [
        {'id':'1', 'parent':None,   'name': '确认身份', 'text': '您好！您是王先生嘛', 'hitcon': '是', 'answer': ['不是', '不对']},
        {'id': '2', 'parent': '1',  'name': '确认身份', 'text': '您好！您是王先生嘛', 'hitcon': '是','answer': ['不是', '不对']},
        {'id': '3', 'parent': '2',  'name': '确认身份', 'text': '您好！您是王先生嘛', 'hitcon': '闲聊','answer': ['不是', '不对']},
        {'id': '4', 'parent': '3',  'name': '确认身份', 'text': '您好！您是王先生嘛', 'hitcon':  '打断','answer': ['不是', '不对']},
        {'id': '5', 'parent': '4',  'name': '确认身份', 'text': '您好！您是王先生嘛', 'hitcon': '咨询','answer': ['不是', '不对']},

        {'id': '6', 'parent': '1', 'name': '确认身份', 'text': '您好！您是王先生嘛', 'hitcon':  '否', 'answer': ['不是', '不对']},
        {'id': '7', 'parent': '2', 'name': '确认身份', 'text': '您好！您是王先生嘛', 'hitcon': '是', 'answer': ['不是', '不对']},
        {'id': '8', 'parent': '3', 'name': '确认身份', 'text': '您好！您是王先生嘛', 'hitcon': '嗯', 'answer': ['不是', '不对']},
        {'id': '9', 'parent': '4', 'name': '确认身份', 'text': '您好！您是王先生嘛', 'hitcon': '嗯', 'answer': ['不是', '不对']},

        {'id': '10', 'parent': '1', 'name': '确认身份', 'text': '您好！您是王先生嘛', 'hitcon':'闲聊', 'answer': ['不是', '不对']},
        {'id': '11', 'parent': '2', 'name': '确认身份', 'text': '您好！您是王先生嘛', 'hitcon': '嗯', 'answer': ['不是', '不对']},
        {'id': '12', 'parent': '1', 'name': '确认身份', 'text': '您好！您是王先生嘛', 'hitcon': '打断', 'answer': ['不是', '不对']},
        {'id': '13', 'parent': '2', 'name': '确认身份', 'text': '您好！您是王先生嘛', 'hitcon':'嗯', 'answer': ['不是', '不对']},
    ]
    tree =Tree()
    tree.createTree(list)
    tree.DFS(tree.root)
    tree.print_tree()

